/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Controlador;

import com.sgsmcan.Dao.PaginationDao;
import com.sgsmcan.Dao.PerfilDao;
import com.sgsmcan.Dao.PerfilDaoImpl;
import com.sgsmcan.Dao.UsuarioDao;
import com.sgsmcan.Dao.UsuarioDaoImpl;
import com.sgsmcan.Entidad.Perfil;
import com.sgsmcan.Entidad.Usuario;
import com.sgsmcan.EntidadFiltro.UsuarioFiltro;
import com.sgsmcan.Utils.FiltroHibernate;
import com.sgsmcan.Utils.Paginacion;
import com.sgsmcan.Utils.Utilitario;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.faces.application.NavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.hibernate.criterion.DetachedCriteria;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author user
 */
@ManagedBean(name = "cuentaBean")
@ViewScoped
public class CuentaControlador implements Serializable {

    private UsuarioDao usuarioDao;
    private UsuarioFiltro usuarioFiltro;
    private PerfilDao daoRol;
    private PaginationDao daoPaginacion;
    private Usuario usuario;
    private Perfil rol;
    private List<Perfil> roles;
    private LazyDataModel<Usuario> usuarios;
    private String auxiliar = null;
    @ManagedProperty("#{usuarioBean}")
    private UsuarioControlador usuarioSesion;

    public CuentaControlador() {
        usuarioDao = new UsuarioDaoImpl();
        daoPaginacion = new PaginationDao();
        rol = new Perfil();
        usuario = new Usuario();
        usuarioFiltro = new UsuarioFiltro();
        
    }
    
    public void generarLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
             usuarioSesion.generarModulo(1);
            daoRol = new PerfilDaoImpl();
            roles = daoRol.getRoles();
            usuarios = new Paginacion<Usuario>(usuarioDao.getUsers(usuarioSesion.getUsuario().getNick()));
        }
    }

    public void generarInsercion() {
        daoRol = new PerfilDaoImpl();
        roles = daoRol.getRoles();
    }

    public void initUpdate() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = FacesContext.getCurrentInstance().getExternalContext().getFlash().get("idCuenta");
            if (parametro == null) {
                FacesContext fc = FacesContext.getCurrentInstance();
                NavigationHandler nh = fc.getApplication().getNavigationHandler();
                nh.handleNavigation(fc, null, "/views/usuario/list.xhtml?faces-redirect=true");
            }
            daoRol = new PerfilDaoImpl();
            roles = daoRol.getRoles();
            usuario = usuarioDao.getForID(String.valueOf(parametro));
            rol.setId(usuario.getRol().getId());
            auxiliar = usuario.getNick();
        }
    }

    public void actualizarUsuario(ActionEvent evnt) {
        if (!esValido()) {
            return;
        }
        usuario.setRol(rol);
        rol.getUsuarios().add(usuario);
        try {
            usuarioDao.actualizar(usuario);
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error al actualizar los datos");
            e.printStackTrace();
            return;
        }
        Utilitario.enviarMensajeGlobalValido("Se ha actualizado correctamente");
    }

    public void insertarUsuario(ActionEvent evnt) {
        if (!esValido()) {
            return;
        }
        usuario.setRol(rol);
        rol.getUsuarios().add(usuario);
        try {
            usuarioDao.insertar(usuario);
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error al insertar los datos");
            e.printStackTrace();
            return;
        }
        Utilitario.enviarMensajeGlobalValido("Se ha ingresado correctamente");
    }

    public String irActualizar(String idCuenta) {
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("idCuenta", idCuenta);
        return "usuarioUpdate";
    }

    public void eliminarCuenta(Usuario user) {
        try {
            usuario = user;
            usuario.setEstado(Boolean.FALSE);
            usuarioDao.eliminar(usuario);
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error al eliminar los datos");
            e.printStackTrace();
            return;
        }
        Utilitario.enviarMensajeGlobalValido("Se ha eliminado correctamente");
    }

    public boolean esValido() {
        if (!esNickValido()) {
            return false;
        }
        if (!esClaveValida()) {
            return false;
        }
        if (!esNombreValido()) {
            return false;
        }
        if (!esApellidoValido()) {
            return false;
        }
        return true;
    }

    public boolean esNickValido() {
        usuario.setNick(usuario.getNick() == null ? usuario.getNick() : usuario.getNick().trim());
        if (Utilitario.esNulo(usuario.getNick())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el usuario");
            return false;
        } else if (!Utilitario.esAlfaNumerico(usuario.getNick())) {
            Utilitario.enviarMensajeGlobalError("El usuario solamente acepta valores alfanumericos [a-z,A-Z,0-9]");
            return false;
        } else if (!Utilitario.esRangoValido(usuario.getNick(), 20)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres del usuario es 20");
            return false;
        }
        try {
            //Para que sea usado tanto para update y insercion
            if (auxiliar == null) {
                if (usuarioDao.existeNick(usuario.getNick())) {
                    Utilitario.enviarMensajeGlobalError("Ya existe el usuario");
                    return false;
                }
            } else {
                if (!auxiliar.equals(usuario.getNick()) && usuarioDao.existeNick(usuario.getNick())) {
                    Utilitario.enviarMensajeGlobalError("Ya existe el usuario");
                    return false;
                }
            }

        } catch (Exception e) {
            return false;
        }
        return true;
    }

    public boolean esClaveValida() {
        usuario.setClave((usuario.getClave() == null ? usuario.getClave() : usuario.getClave().trim()));
        if (Utilitario.esNulo(usuario.getClave())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar la clave");
            return false;
        } else if (!Utilitario.esAlfaNumerico(usuario.getClave())) {
            Utilitario.enviarMensajeGlobalError("El clave solamente acepta valores alfanumericos");
            return false;
        } else if (!Utilitario.esRangoValido(usuario.getClave(), 16)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres de la clave es 16");
            return false;
        }
        return true;
    }

    public boolean esNombreValido() {
        usuario.setNombre(usuario.getNombre() == null ? usuario.getNombre() : usuario.getNombre().trim());
        if (Utilitario.esNulo(usuario.getNombre())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el nombre");
            return false;
        } else if (!Utilitario.esSoloLetras(usuario.getNombre())) {
            Utilitario.enviarMensajeGlobalError("El nombre solamente debe ser letras");
            return false;
        } else if (!Utilitario.esRangoValido(usuario.getNombre(), 60)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres del nombre es 60");
            return false;
        }
        return true;
    }

    public boolean esApellidoValido() {
        usuario.setApellido(usuario.getApellido() == null ? usuario.getApellido() : usuario.getApellido().trim());
        if (Utilitario.esNulo(usuario.getApellido())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el apellido");
            return false;
        } else if (!Utilitario.esSoloLetras(usuario.getApellido())) {
            Utilitario.enviarMensajeGlobalError("El apellido solamente debe ser letras");
            return false;
        } else if (!Utilitario.esRangoValido(usuario.getApellido(), 80)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres del apellido es 80");
            return false;
        }
        return true;
    }
    
    public void buscarFiltro(ActionEvent event)
    {
        FiltroHibernate filtroHibernate = new FiltroHibernate(usuarioDao.getUsers(usuarioSesion.getUsuario().getNick()));
        filtroHibernate.addLikeNullParametro(usuarioFiltro.getNombre(),"user.nick");
        filtroHibernate.addComboParametro(usuarioFiltro.getPerfil(),"role.id");
        DetachedCriteria criteria = filtroHibernate.executeFiltro();
        usuarios = new Paginacion<Usuario>(criteria);
    }
    
    public void limiparFiltro(ActionEvent event){
        usuarios = new Paginacion<Usuario>(usuarioDao.getUsers(usuarioSesion.getUsuario().getNick()));
        usuarioFiltro = new UsuarioFiltro();
    }

    /*GETTER AND SETTER*/
    public void setUsuarioSesion(UsuarioControlador usuarioSesion) {
        this.usuarioSesion = usuarioSesion;
    }

    public LazyDataModel<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(LazyDataModel<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Perfil getRol() {
        return rol;
    }

    public void setRol(Perfil rol) {
        this.rol = rol;
    }

    public List<Perfil> getRoles() {
        return roles;
    }

    public void setRoles(List<Perfil> roles) {
        this.roles = roles;
    }

    public UsuarioFiltro getUsuarioFiltro() {
        return usuarioFiltro;
    }

    public void setUsuarioFiltro(UsuarioFiltro usuarioFiltro) {
        this.usuarioFiltro = usuarioFiltro;
    }
    
    
    
}
